Prekresleni formu

Otázka od: Beneš Jaroslav

18. 11. 2002 12:49

Ahoj,
mam maly problem.
V programu, ktery provadi pakovani cabinetu, bych potreboval okamzite
prekresleni (napriklad kdyz je zakryt jinym oknem, ktere je pak
zavreno/minimalizovano). Program mi ale prekresli az pri nejblizsim counter-
refresh, pri vypisu poctu jiz zapakovanych paketu.

Jak bych to mohl co nejjednoduseji resit?

Diky

Jaro B.

Odpovedá: Lebeda David

18. 11. 2002 14:34

> V programu, ktery provadi pakovani cabinetu, bych potreboval okamzite
> prekresleni (napriklad kdyz je zakryt jinym oknem, ktere je pak
> zavreno/minimalizovano). Program mi ale prekresli az pri nejblizsim
> counter-refresh, pri vypisu poctu jiz zapakovanych paketu.

Ahoj,

predpokladam, ze tam probiha nejaky cykl, ktery jednou za cas
zajisti i prekresleni formu, at uz pomoci
Application.ProcessMessages nebo pomoci Form.Update apod. V
takovem pripade bych rekl, ze moc moznosti neni:

1) Zajistit prekresleni formu casteji

2) Ten zdrzujici vypocet dat do threadu.

Nebo jsem mimo?

David Lebeda

Odpovedá: Petr Vones

18. 11. 2002 15:12

From: "Lebeda David" <david.lebeda@comarr.cz>
> 1) Zajistit prekresleni formu casteji
>
> 2) Ten zdrzujici vypocet dat do threadu.
>
> Nebo jsem mimo?

2) je spravne

Petr Vones

Odpovedá: Blazek Jaroslav

18. 11. 2002 16:22

Ahoj,

> david.lebeda@comarr.cz 18.11.02 13:32 >>>
>predpokladam, ze tam probiha nejaky cykl, ktery jednou za cas
>zajisti i prekresleni formu, at uz pomoci
>Application.ProcessMessages nebo pomoci Form.Update apod. V
>takovem pripade bych rekl, ze moc moznosti neni:
>1) Zajistit prekresleni formu casteji
>2) Ten zdrzujici vypocet dat do threadu.
>Nebo jsem mimo?

vubec nejsi mimo....nejlepsi zpusob je ten druhy...
tady je i prikladek na thready
http://forum.builder.cz/read.php?f=18&i=12056&t=11638


S pozdravem

Bc. Jaroslav Blazek
Access-IT Ceska Lipa
mailto:jaroslav.blazek@access-it.cz
http://www.access-it.cz
ICQ# : 133673990
+420605/813644

Odpovedá: Martin Schayna

18. 11. 2002 17:47

----- Original Message -----
From: "Lebeda David" <david.lebeda@comarr.cz>
> > V programu, ktery provadi pakovani cabinetu, bych potreboval okamzite
> > prekresleni (napriklad kdyz je zakryt jinym oknem, ktere je pak
>
> predpokladam, ze tam probiha nejaky cykl, ktery jednou za cas
> zajisti i prekresleni formu, at uz pomoci
> Application.ProcessMessages nebo pomoci Form.Update apod. V
> takovem pripade bych rekl, ze moc moznosti neni:
> 1) Zajistit prekresleni formu casteji
> 2) Ten zdrzujici vypocet dat do threadu.

Lepsi reseni je samozrejme thread. Ale pokud je to kanon na vrabce, je
mozne pravidelne (ale ne casteji nez parkrat do sekundy) v cyklu:

a) bud vyvolat Application.ProcessMessages (s tim ze musis disablovat ovladaci
prvky,
aby uzivatel nemohl behem dlouhotrvajici akce nic zleho udelat -- pred casem
tady
okolo toho byla debata)

b) nebo vynutit prekresleni bud celemu formu nebo jen nekolika komponentam
na nem (napr. progressbaru) a to zpravidla pomoci metody Refresh. Toto reseni
ovsem prestava fungovat na Windows XP -- tam pokud aplikace nereaguje tj.
neodebira zpravy z fronty, nic se neprekresluje. Provizorni reseni pro Windows
XP
ktere mi funguje je po Refresh volat tento kod:

procedure TWaitWinForm.ProcessOwnMessages;
var
  Msg: TMsg;
begin
  while PeekMessage(Msg, Self.Handle, 0, 0, PM_REMOVE) do begin
    // budeme zpracovavat pouze vlastni zpravy a to pouze pro prekreslovani
    if Msg.Message = WM_PAINT then
    begin
      TranslateMessage(Msg);
      DispatchMessage(Msg);
    end;
  end;
end;

Martin Schayna